package com.uraurora.crescent.ai.fsm.configurer;

import com.uraurora.crescent.ai.fsm.action.IAction;

import java.util.function.BiConsumer;

/**
 * 状态转换抽象的配置接口
 * @author gaoxiaodong
 * @param <TRANSITION> 状态转换抽象
 * @param <EVENT> 事件
 * @param <STATE> 状态
 */
public interface ITransitionConfigurer<TRANSITION, EVENT, STATE> {

    /**
     * 设置状态转换的起始状态
     * @param source 起始状态
     * @return 状态转换抽象类
     */
    TRANSITION source(STATE source);
    /**
     * 设置状态转换的目标状态
     * @param target 目标状态
     * @return 状态转换抽象类
     */
    TRANSITION target(STATE target);

    /**
     * 触发状态转换的事件
     * @param event 事件
     * @return 状态转换抽象类
     */
    TRANSITION event(EVENT event);

    /**
     * 触发状态转换后的具体行为
     * @param action 行为接口，定义了行为的执行方法，参考 {@link IAction}
     * @return 状态转换抽象类
     */
    TRANSITION action(IAction<EVENT, STATE> action);

    /**
     * 触发状态转换后的具体行为
     * @param action 简单的行为函数接口，输入事件和状态执行无返回值
     * @return 状态转换抽象类
     */
    TRANSITION action(BiConsumer<EVENT, STATE> action);

    /**
     * 触发状态转换后的具体行为
     * @param action 行为，参考 {@link Runnable}
     * @return 状态转换抽象类
     */
    TRANSITION action(Runnable action);

    /**
     * 指明该转换操作属于哪个状态，用于分层状态机(HFSM)
     * @param state 状态
     * @return 状态转换抽象类
     */
    TRANSITION parent(STATE state);

}
